/// @tags: DP
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

namespace BlueQuantum {

typedef long long LL;

int const N = 6e2 + 5, mod = 1e9 + 7;

int n, m;
int g[N], sum[N], to[N];
int f[N][N];

inline int calc(int l, int r) { return r - l + 1 - sum[r] + sum[l - 1]; }

inline int add(int a, int b) {
  a += b;
  return a >= mod ? a - mod : a;
}

inline int dec(int a, int b) {
  a -= b;
  return a < 0 ? a + mod : a;
}

inline int main() {
  cin >> n >> m;
  n *= 2;
  for (int i = 1, x, y; i <= m; ++i) {
    cin >> x >> y;
    sum[x] = sum[y] = 1;
    to[x] = y, to[y] = x;
  }
  for (int i = 1; i <= n; ++i) sum[i] += sum[i - 1];
  g[0] = 1;
  for (int i = 2; i <= n; i += 2) g[i] = (LL)g[i - 2] * (i - 1) % mod;
  int ans = 0;
  for (int i = 1; i <= n; ++i)
    for (int j = i; j <= n; ++j)
      if ((j - i) & 1) {
        bool flag = false;
        for (int k = i; k <= j; ++k)
          if (to[k] && (to[k] < i || to[k] > j)) flag = true;
        if (flag) continue;
        f[i][j] = g[calc(i, j)];
        for (int k = i + 1; k < j; ++k)
          f[i][j] = dec(f[i][j], (LL)f[i][k] * g[calc(k + 1, j)] % mod);
        ans = add(ans, (LL)f[i][j] * g[calc(1, i - 1) + calc(j + 1, n)] % mod);
      }
  cout << ans;
  return 0;
}

}  // namespace BlueQuantum

int main() {
#ifndef ONLINE_JUDGE
#ifdef LOCAL
  freopen("/tmp/CodeTmp/testdata.in", "r", stdin);
  freopen("/tmp/CodeTmp/testdata.out", "w", stdout);
#else
  freopen("AT4438 [AGC028D] Chords.in", "r", stdin);
  freopen("AT4438 [AGC028D] Chords.out", "w", stdout);
#endif
#endif

  ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
  return BlueQuantum::main();
}
